﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using FAS.Objetos;
using System.Drawing.Imaging;
using System.Net;
using FasGUI;


namespace FAS.App_Code
{
    class PDFCreator
    {
        private IList<Examen> examenes;
        private Parcial parcial;
        private String nombre;
        public PDFCreator(IList<Examen> e, Parcial p)
        {
            this.examenes = e;
            this.parcial = p;
            this.nombre = examenes.ElementAt(0).pdf + ".pdf";
        }
        private void addEncabezado(Document d)
        {
            //encabezado
            iTextSharp.text.Font myfont = new iTextSharp.text.Font(
            FontFactory.GetFont(FontFactory.TIMES_BOLD, 8, iTextSharp.text.Font.ITALIC));
            Paragraph pa = new Paragraph("TEC DE MONTERREY \n", myfont);
            pa.Add("Campus Zacatecas \n");
            pa.Add("Examen de " + parcial.Materia);
            pa.Add(" Periodo " + parcial.Fecha);
            pa.Alignment = Element.ALIGN_CENTER;
            d.Add(pa);


            iTextSharp.text.Font my = new iTextSharp.text.Font(
            FontFactory.GetFont(FontFactory.TIMES, 8, iTextSharp.text.Font.ITALIC));
            Paragraph pb = new Paragraph(parcial.ParcialP + " Parcial", my);
            pb.Add("\n");
            pb.Alignment = Element.ALIGN_CENTER;
            d.Add(pb);

        }

        public void addInfoPags(Document d, int tot, int pag, int exa)
        {
            //numero de examen
            iTextSharp.text.Font myfont = new iTextSharp.text.Font(FontFactory.GetFont(FontFactory.TIMES, 7, iTextSharp.text.Font.NORMAL));
            String str = "# Examen: " + exa + " - " + examenes.Count + "                Pagina " + pag + " de " + tot; 
            Paragraph numDeExamen = new Paragraph();
            numDeExamen.Font = myfont;
            numDeExamen.Add(str);
            numDeExamen.Alignment = Element.ALIGN_RIGHT;
            Image img = Image.GetInstance("itesm.png");
            img.ScalePercent(13, 10);
            numDeExamen.Add(new Phrase(new Chunk(img, -662, 22, false)));
            d.Add(numDeExamen);
        }
        public void CrearPdf()
        {
            if (System.IO.File.Exists(nombre))
            {
                try
                {
                    System.IO.File.Delete(nombre);
                }
                catch (System.IO.IOException e)
                {
                    Console.WriteLine(e.Message);
                    return;
                }
            }

            Document document = new Document();
            PdfWriter.GetInstance(document, new FileStream(nombre, FileMode.OpenOrCreate));
            document.Open();

            //agregar partes
            addEncabezado(document);
            //document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate());
            document.Add(new Paragraph(parcial.Materia));
            document.Add(new Paragraph("Clave"));
            int po = 1;
            foreach (Examen exa in examenes)
            {
                document.Add(new Paragraph("# Examen: " + po + " " + exa.Clave));
                int o = 1;
                foreach (Problema pro in exa.Problemas)
                {
                    string[] inciso = new string[4] { "a)", "b)", "c)", "d)" };
                    int respuesta = 0;
                    foreach (Opcion op in pro.Opciones)
                    {
                        if (op.Respuesta)
                            break;
                        respuesta++;
                    }

                    document.Add(new Paragraph(o + " " + inciso[respuesta]));
                    //document.Add(new Paragraph(pro.IdObjetivo+""+pro.IdProblema+"-"+o+" "+inciso[respuesta]));///////////////pregunta
                    o++;
                }
                po++;
            }
            document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate());
            //document.NewPage();

            int i = 0;
            foreach (Examen exam in examenes)
            {

                int page = 1;
                i++;
                document.NewPage();
                addEncabezado(document);


                int x = 0;
                IList<PdfPTable> list = new List<PdfPTable>();
                int numTablas;
                if (exam.Problemas.Count % 4 == 0)
                    numTablas = exam.Problemas.Count / 4;
                else
                    numTablas = (exam.Problemas.Count / 4) + 1;

                for (int f = 0; f < numTablas; f++)
                {
                    PdfPTable bTable = new PdfPTable(2);
                    bTable.HorizontalAlignment = Element.ALIGN_LEFT;
                    bTable.WidthPercentage = 100;
                    list.Add(bTable);
                }

                iTextSharp.text.Font myfont = new iTextSharp.text.Font(
                FontFactory.GetFont(FontFactory.TIMES, 9, iTextSharp.text.Font.NORMAL));

                addInfoPags(document, numTablas, page, i);
                foreach (Problema prob in exam.Problemas)
                {
                    int porcentage = 60;
                    //agregar pregunta

                    string nombreProblema = "problema.png";
                    string nombreA = "a.png";
                    string nombreB = "b.png";
                    string nombreC = "c.png";
                    string nombreD = "d.png";
                    Simon simon = new Simon();
                    simon.rich.Rtf = prob.Texto;
                    new SaveImage(simon.rich, nombreProblema);
                    simon.rich.Rtf = prob.Opciones[0].Texto;
                    new SaveImage(simon.rich, nombreA);
                    simon.rich.Rtf = prob.Opciones[1].Texto;
                    new SaveImage(simon.rich, nombreB);
                    simon.rich.Rtf = prob.Opciones[2].Texto;
                    new SaveImage(simon.rich, nombreC);
                    simon.rich.Rtf = prob.Opciones[3].Texto;
                    new SaveImage(simon.rich, nombreD);
                   
                    Image img = Image.GetInstance(nombreProblema);
                    img.Alignment = Image.TEXTWRAP | Image.ALIGN_LEFT;
                    img.ScalePercent(porcentage);
                    PdfPCell cell = new PdfPCell(img);
                    iTextSharp.text.Font f = new iTextSharp.text.Font(FontFactory.GetFont(FontFactory.TIMES, 10, iTextSharp.text.Font.BOLDITALIC));
                    Paragraph pregunta = new Paragraph("Pregunta: " + (x + 1), f);
                    pregunta.Add("\n");
                    pregunta.Add(new Phrase(new Chunk(img, 10, 0, true)));
                    cell.AddElement(pregunta);
                    Image opcionA = Image.GetInstance(nombreA);
                    Image opcionB = Image.GetInstance(nombreB);
                    Image opcionC = Image.GetInstance(nombreC);
                    Image opcionD = Image.GetInstance(nombreD);
                    //ajustar escalas de imagenes
                    opcionA.Alignment = Image.ALIGN_BOTTOM | Image.ALIGN_BOTTOM;// Image.RIGHT_ALIGN;
                    opcionA.ScalePercent(porcentage);
                    opcionB.Alignment = Image.ALIGN_BOTTOM | Image.ALIGN_BOTTOM;
                    opcionB.ScalePercent(porcentage);
                    opcionC.Alignment = Image.ALIGN_BOTTOM | Image.ALIGN_BOTTOM;
                    opcionC.ScalePercent(porcentage);
                    opcionD.Alignment = Image.ALIGN_BOTTOM | Image.ALIGN_BOTTOM;
                    opcionD.ScalePercent(porcentage);
                    //desplegar opciones
                    PdfPTable t = new PdfPTable(2);
                    t.WidthPercentage = 100;
                    PdfPCell c1 = new PdfPCell();
                    c1.BorderColor = BaseColor.WHITE;
                    PdfPCell c2 = new PdfPCell();
                    c2.BorderColor = BaseColor.WHITE;
                    PdfPCell c3 = new PdfPCell();
                    c3.BorderColor = BaseColor.WHITE;
                    PdfPCell c4 = new PdfPCell();
                    c4.BorderColor = BaseColor.WHITE;
                    Paragraph p = new Paragraph("", myfont);
                    p.Add("A)");
                    p.Add(new Phrase(new Chunk(opcionA, 10, 0, true)));
                    Paragraph p1 = new Paragraph("", myfont);
                    p1.Add("B)");
                    p1.Add(new Phrase(new Chunk(opcionB, 10, 0, true)));
                    Paragraph p2 = new Paragraph("", myfont);
                    p2.Add("C)");
                    p2.Add(new Phrase(new Chunk(opcionC, 10, 0, true)));
                    Paragraph p3 = new Paragraph("", myfont);
                    p3.Add("D)");
                    p3.Add(new Phrase(new Chunk(opcionD, 10, 0, true)));
                    c1.AddElement(p);
                    c2.AddElement(p1);
                    c3.AddElement(p2);
                    c4.AddElement(p3);
                    t.AddCell(c1);
                    t.AddCell(c2);
                    t.AddCell(c3);
                    t.AddCell(c4);
                    cell.AddElement(t);
                    //cell.AddElement(p);
                    //cell.AddElement(p1);
                    //cell.AddElement(p2);
                    //cell.AddElement(p3);

                    cell.BorderColor = BaseColor.WHITE;
                    list.ElementAt(x / 4).AddCell(cell);
                    if (x % 4 == 0 && x != 0)
                    {
                        document.Add(list.ElementAt((x / 4) - 1));
                        if (x != exam.Problemas.Count)
                        {
                            document.NewPage();
                            page++;
                            addEncabezado(document);
                            addInfoPags(document, numTablas, page, i);
                        }
                    }
                    if (x + 1 == exam.Problemas.Count)
                    {
                        if (exam.Problemas.Count % 2 != 0)
                        {
                            PdfPCell c = new PdfPCell(new Paragraph(""));
                            c.BorderColor = BaseColor.WHITE;
                            list.ElementAt(x / 4).AddCell(c);
                        }
                        document.Add(list.ElementAt((x / 4)));
                    }
                    x++;

                }
                //document.Add(list.ElementAt((x / 4)));
            }
            document.Close();
            AbrirPdf();
        }

        public void AbrirPdf()
        {
            System.Diagnostics.Process.Start(nombre);
        }
    }
}
